#include "../inc/music.h"
#include <dirent.h>      // 用于遍历目录
#include <iostream>
#include <cstdlib>       // 用于rand()
#include <ctime>         // 用于初始化随机数种子
#include <unistd.h>      // 用于fork()、execvp()
#include <sys/wait.h>    // 用于waitpid()
#include <signal.h>      // 用于kill()
#include <cstring>       // 用于字符串处理

using namespace std;

// 遍历目录，收集所有.mp3文件
void LocalMusicPlayer::loadMp3Files() {
    DIR* dir = opendir(musicDir.c_str());
    if (dir == nullptr) {
        cerr << "无法打开音乐目录: " << musicDir << endl;
        return;
    }

    dirent* entry;
    while ((entry = readdir(dir)) != nullptr) {
        string filename = entry->d_name;
        if (filename.size() >= 4) {
            string ext = filename.substr(filename.size() - 4);
            if (ext == ".mp3" || ext == ".MP3") {
                mp3Files.push_back(musicDir + "/" + filename);
                cout << "发现音乐文件: " << mp3Files.back() << endl;
            }
        }
    }
    closedir(dir);

    // 初始化随机数种子（仅一次）
    static bool seedInitialized = false;
    if (!seedInitialized) {
        srand(time(nullptr));
        seedInitialized = true;
    }
}

// 随机播放一首MP3
void LocalMusicPlayer::playRandom() {
    // 先停止当前播放
    stop();

    // 检查是否有MP3文件
    if (mp3Files.empty()) {
        cerr << "音乐目录中没有找到MP3文件: " << musicDir << endl;
        return;
    }

    // 随机选择一个文件
    int randomIndex = rand() % mp3Files.size();
    string selectedFile = mp3Files[randomIndex];
    cout << "即将播放: " << selectedFile << endl;

    // 创建子进程执行madplay命令
    playPid = fork();
    if (playPid == 0) {
        // 子进程：执行madplay（-q表示安静模式，不输出冗余信息）
        const char* args[] = {"madplay", "-q", selectedFile.c_str(), nullptr};
        execvp("madplay", (char* const*)args);

        exit(1); // 子进程退出
    } else if (playPid < 0) {
        // 创建进程失败
        cerr << "创建播放进程失败" << endl;
        playPid = 0;
    }
}

// 停止当前播放
void LocalMusicPlayer::stop() {
    if (playPid != 0) {
        // 向播放进程发送终止信号
        kill(playPid, SIGTERM);
        // 等待进程退出，避免僵尸进程
        waitpid(playPid, nullptr, 0);
        playPid = 0;
        cout << "音乐已停止" << endl;
    }
}